#ifndef PARSTR_H
#define PARSTR_H

#include "bool.h"

typedef struct sparStr * parStr;

parStr
parStr_create(const char * fst, const char * snd);
/*
DESC: Constructor. Toma 2 null terminated strings. 
      No los usa.
      Devuelve NULL si no hay memoria.      
PRE: { e = NULL /\ fst -> S1 /\ snd -> S2 }
  e = parStr_create(S1,S2);  
POS: {  Hay memoria ==>  e --> (S1,S2)   
      ! Hay memoria ==>  e = NULL  }   
*/

parStr
parStr_destroy(parStr e);
/*
DESC: Destructor del tipo. e cambia.
PRE: { e --> E }
   e = parStr_destroy(e);
POS: { Se destruye E /\ e == NULL }
*/

#ifndef CRW_IMPL
/* lo que sigue no se usa en la cinta */

char *
parStr_fst(const parStr e);
/*
DESC: Devuelve un nuevo string (despues de usarlo hay que liberarlo) que 
      representa el primer elemento de parStr.
PRE: { e --> E /\ s = NULL }
        s = parStr_fst(e);
POS: {   Hay memoria ==> s --> toStr(fst(E)) 
       ! Hay memoria ==> s == NULL }
*/

char *
parStr_snd(const parStr e);
/*
DESC: Devuelve un nuevo string (despues de usarlo hay que liberarlo) que 
      representa el segundo elemento de parStr.
PRE: { e --> E /\ s = NULL }
        s = parStr_snd(e);
POS: {   Hay memoria ==> s --> toStr(snd(E)) 
       ! Hay memoria ==> s == NULL }
*/

#endif /* CRW_IMPL */


parStr 
parStr_clone(const parStr e);
/*
DESC: Construye una copia.
PRE: { e1 --> E1 /\ e2 = NULL }
   e2 = parStr_clone(e1);  
POS: {  Hay memoria ==> e1 --> E1 /\ e2 --> E1 /\ e1 != e2
      ! Hay memoria ==> e2 == NULL /\ e1 --> E1 }
*/

#ifdef CRW_IMPL
/* lo que sigue se usa solo en la cinta */

#include <stdio.h>

parStr
parStr_fromStream(FILE *f);
/*
DESC: Constructor. Lee un parStror desde un stream. 
      Devuelve NULL si no hay memoria o hubo error de archivo 
      (error de hardware o parseo).
PRE: { e = NULL /\ f -> F }
  e = parStr_fromStream(f);  
POS: {  Hay memoria /\ ! Error de Archivo ==>  e --> fromStream(F)   
      ! Hay memoria \/  Error de Archivo  ==>  e = NULL  }   
*/

bool
parStr_toStream(FILE *f, const parStr e);
/*
DESC: Guarda el parStr en un stream. 
PRE: { e -> E /\ f -> F }
  b = parStr_toStream(f,e);  
POS: { ! Error de Archivo ==> b /\ f -> add(F,e) 
         Error de Archivo ==> !b }   
*/

#endif /* CRW_IMPL */

#endif /* PARSTR_H */
